import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
 * Write a description of class Product here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Product implements Serializable
{
    // instance variables - replace the example below with your own
    private String naam;
    private Prijs inkoopPrijs;
    private Prijs verkoopPrijs;
    private ArrayList<Voorraad> voorraden;


    /**
     * Constructor for objects of class Product
     */
    public Product (String naam, double prijs1, double prijs2, int voorradenMagazijn, Datum houdbaarheidsDatum)
    {
        voorraden = new ArrayList<Voorraad>();
        this.naam = naam;
        inkoopPrijs = new Prijs(this, prijs1);
        verkoopPrijs = new Prijs(this, prijs2);
        addVoorraad(houdbaarheidsDatum, voorradenMagazijn);
    }

    //methodes
    public void addVoorraad(Datum houdbaarheidsDatum, int voorraadMagazijn){
        if(voorraden.size()>0){
            Voorraad v = voorraden.get(0);
            Datum date = new Datum( 99, 99, 9999 );
            if(v.getDatum()== date){
                voorraden.remove(0);
            }
        }
        Voorraad voorraad = new Voorraad(houdbaarheidsDatum,voorraadMagazijn);
        voorraden.add(voorraad);
    }
    
    // Verander de inkoopprijs van product
    public void setInkoopPrijs(double prijs1){
        inkoopPrijs.setPrijs(prijs1);
    }
    
    //Verander de verkoopprijs van product
    public void setVerkoopPrijs(double prijs1){
        verkoopPrijs.setPrijs(prijs1);
    }   
        
    //korting weg
    public void kortingWeg(double prijs1){
        verkoopPrijs = new Prijs(this, prijs1);
    }
    //Stel korting in voor dit product
    public void setKorting(double korting){
        double prijs1 = verkoopPrijs.getPrijs();
        verkoopPrijs = new Korting(this, prijs1, korting);
    }
    
    //Stel 2 voor prijs van 1 korting in voor dit product
    public void setKortingTweeVoorEen(){
        double prijs1 = verkoopPrijs.getPrijs();
        verkoopPrijs = new TweeVoorEen(this, prijs1);
    }
    
    //Haal product uit magazijn en zet in afdeling
    public void addVoorraadAfdeling(int aantal){
        while(aantal > 0){
                for ( int i = 0; i < voorraden.size(); i++){
                    if(voorraden.get(i).getVoorraadMagazijn() >= aantal){
                        voorraden.get(i).minVoorraadMagazijn(aantal);
                        voorraden.get(i).plusVoorraadAfdeling(aantal);
                        aantal = 0;
                    } else {
                        int x = voorraden.get(i).getVoorraadMagazijn();
                        voorraden.get(i).plusVoorraadAfdeling(x);
                        voorraden.get(i).minVoorraadMagazijn(x);
                        aantal -= x;
                    }
                }
        }
    }

    
    //Voeg bestelde producten toe aan magazijn
    public void addVoorraadMagazijn( int aantal, Datum datum){
        zoekVoorraad(datum).plusVoorraadMagazijn(aantal);
    }
    
    //Kijk of datum van product zelfde datum heeft als die van vandaag
    public boolean isZelfdeDatum(){
        return voorraden.get(0).isZelfdeDatum();
    }
      
    //Verander aantal van dit product aanwezig in winkelmandje
    public void addAantalWinkelwagen(int aantal){        
        while(aantal > 0){
                for ( int i = 0; i < voorraden.size(); i++){
                    if(voorraden.get(i).getVoorraadAfdeling() >= aantal){
                        voorraden.get(i).plusAantalWinkelwagen(aantal);
                        voorraden.get(i).minVoorraadAfdeling(aantal);
                        aantal = 0; 
                    } else {
                        int x = voorraden.get(i).getVoorraadAfdeling();
                        voorraden.get(i).plusAantalWinkelwagen(x);
                        voorraden.get(i).minVoorraadAfdeling(x);
                        aantal -= x;
                    }
                }
        }
    }
    
    //Verander aantal in winkelwagen
    public void setAantalWinkelwagen(int aantal){
        for(Voorraad v : voorraden){
            v.setAantalWinkelwagen(aantal);
        }
    }
    
    public Datum getHoudbaarheidsDatum(){
        return voorraden.get(0).getDatum();
    }
    
    //producten over datum afboeken\\
    public ArrayList<Bonregel> overDatum(){
        ArrayList<Bonregel> bonregels = new ArrayList<Bonregel>();
        for(int i=0;i<voorraden.size();i++){
            Voorraad v = voorraden.get(i);
            if(v.getDatum().overDatum() ){
                if(voorraden.size()>1){
                    bonregels.add( new Bonregel(v.getAlleVoorraad(), this, this.getInkoopPrijs() ) );
                    voorraden.remove(i );
                }
                else{
                    v.setVoorraadMagazijn(0);
                    v.setVoorraadAfdeling(0);
                    v.setDatum( new Datum( 99, 99, 9999 ) );
                }
            }
        }
        return bonregels;  
    }

    //getters
    //Haalt naam op van product
    public String getNaam(){
        return naam;
    }
    
    //Haalt inkoopprijs op van product
    public double getInkoopPrijs(){
        return inkoopPrijs.getPrijs();
    }
    
    //Haalt verkoopprijs op van product
    public double getVerkoopPrijs(){
        return verkoopPrijs.getPrijs();
    }
    
    //Haalt totaalprijs op van product in winkelmandje
    public double prijsWinkelmandje(){
        return verkoopPrijs.prijs(getAantal());
    }
    
    //Is er korting?
    public boolean korting(){
        if (verkoopPrijs instanceof TweeVoorEen){
            return true;
        }else if(verkoopPrijs instanceof Korting){
            return true;
        }else
        return false;
    }
    //Welke korting is er
    public String welkeKorting(){
        String result = "false";
        if (korting()){
            if ( verkoopPrijs instanceof TweeVoorEen ){
                result = "2 voor de prijs van 1";
            }
            if ( verkoopPrijs instanceof Korting ){
                result = String.format("%.0f%%", verkoopPrijs.bekijkKorting() );
            }
        }
        return result;
    }
    
    //Haalt Voorraad op van product in magazijn
    public int getVoorraadMagazijn(){
        int v = 0;
        for (Voorraad voorraad : voorraden){
            v += voorraad.getVoorraadMagazijn();
        }
        return v;
    }
    
    //Haalt Voorraad op van product in de afdeling
    public int getVoorraadAfdeling(){
        int v = 0;
        for (Voorraad voorraad : voorraden){
            v += voorraad.getVoorraadAfdeling();
        }
        return v;
    }
    
    public int getAantalWinkelwagen(){
        int v = 0;
        for (Voorraad voorraad : voorraden){
            v += voorraad.getAantalWinkelwagen();
        }
        return v;
    }
        
    public String toString(){
        String s = naam + ",\t prijs: ";
        s += String.format("%.2f", verkoopPrijs.getPrijs());
        s += "EUR,\t Voorraad: " + getVoorraadAfdeling() + ",\t houdbaarheidsDatum: " + getHoudbaarheidsDatum().toString();
        if(korting()){
            s+= ",\t Korting: " + welkeKorting();
        }
        return s;
        
    }
   
    public String toStringManager(){
        String s = naam + ",\t Verkoopprijs: ";
        s += String.format("%.2fEUR,", verkoopPrijs.getPrijs());
        s += "\tInkoopprijs: ";
        s += String.format("%.2fEUR,", inkoopPrijs.getPrijs());
        s += "\tVoorraad Afdeling: " + getVoorraadAfdeling() + ",\tVoorraad Magazijn: " + getVoorraadMagazijn() + ", houdbaarheidsDatum: " + getHoudbaarheidsDatum().toString();
        if(korting()){
            s+= ", Korting: " + welkeKorting();
        }
        return s;
        
    }
    
    public String toStringMandje(){
        String s =  naam + ",\t Prijs: ";
        s += String.format("%.2f", verkoopPrijs.getPrijs());
        s += "EUR,\t Aantal: " + getAantal() + ",\t TotaalPrijs: ";
        s += String.format("%.2f", prijsWinkelmandje());
        s += "EUR";
        if(korting()){
            s+= ",\t Korting: " + welkeKorting();
        }
        return s;
    }
    
    public int getAantal(){
        return voorraden.get(0).getAantalWinkelwagen();
    }
    
    //Voeg meer van zelfde product toe
    public void plusAantal(Datum datum, int aantal){
        int i=0;
        for(Voorraad v : voorraden){
            if(v.getDatum().zelfdeDatum(datum)){
                voorraden.get(i).plusAantalWinkelwagen(aantal);
            }
            i++;
        }
    }

  
    public String toString(int nul){
        String s = naam + ",\t prijs: ";
        s += String.format("%.2f", verkoopPrijs.getPrijs());
        s += "EUR,\t Voorraad: " + getVoorraadAfdeling();
        if(korting()){
            s+= ",\t Korting: " + welkeKorting();
        }
        return s;
    }
    
    public double bekijkKorting(){
        return verkoopPrijs.bekijkKorting();
    }
    
    public void minVoorraadAfdeling(int aantal, Datum datum){
        zoekVoorraad(datum).minVoorraadAfdeling(aantal);
    }
    
    public void plusVoorraadAfdeling(int aantal, Datum datum){
        zoekVoorraad(datum).plusVoorraadAfdeling(aantal);
    }
    
    public void minAantalWinkelwagen(int aantal, Datum datum){
        zoekVoorraad(datum).minAantalWinkelwagen(aantal);
    }
    
    public Voorraad zoekVoorraad(Datum datum){
        Voorraad voorraad = null;
        for(Voorraad v : voorraden){
            if(v.getDatum().zelfdeDatum(datum)){
                voorraad = v;
            }
        }
        if(voorraad == null){
            System.err.println("Er is geen product bij deze datum");
        }
        return voorraad;
    }

    
    
    public void verwijderVoorraad(){
        for( int i = 0; i < voorraden.size(); i++){
            Voorraad v = voorraden.get(i);
            if(v.getVoorraadAfdeling() == 0 && v.getVoorraadMagazijn() == 0 && v.getAantalWinkelwagen() == 0 && voorraden.size()> 1 ){
                voorraden.remove( i );
            }
        }
    }
    
    public void sorteerDatum() {
        Voorraad temp = null;
        for (int position = voorraden.size() - 1; position >= 0; position--) {
            for (int scan = 0; scan <= position - 1; scan++) {
                if (voorraden.get(scan).getDatum().vergelijkDatum( voorraden.get(scan + 1).getDatum() ) ) {
                    temp = voorraden.get(scan);
                    voorraden.set(scan, voorraden.get(scan + 1) );
                    voorraden.set(scan + 1, temp);
                }
            }
        }
    }
    
    //Verwijderd de hele voorraad. Word gebruikt als het schap brand. xD
    public void verwijderVoorraadAfdeling(){
        for(Voorraad v : voorraden){
            v.setVoorraadAfdeling(0);
        }
    }
    //Verwijderd een aantal producten. Gebruikt bij bestolen worden.
    public void minAantalWinkelwagen(int aantal){
        for(Voorraad v : voorraden){
            v.minAantalWinkelwagen(aantal);
        }
    }
    
    public void verkoopGegevensWegschrijven(ArrayList<Bon> bonnen){
        ReadWrite e = new ReadWrite( bonnen, this);
    }

}
